package co.inventario.datos.sqlserver;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import co.inventario.entidad.FacturaDTO;
import co.inventario.entidad.PedidoVentaDTO;

public class FacturaDAOSQLServer {

	private String crearSQL;
	private String actualizarSQL;
	private String consultarSQL;

	public FacturaDAOSQLServer() {
		crearSQL = "";
		actualizarSQL = "";
		consultarSQL = "";
	}

	public void crear(FacturaDTO facturaDTO, Connection connection) throws SQLException {
		crearSQL = "INSERT INTO Factura (In_Consecutivo_Factura, Da_Fecha_Factura, In_Codigo_PedidoVenta, Nv_Estado_Factura) VALUES (?, ?, ?, ?)";
		try (PreparedStatement preparedStatement = connection.prepareStatement(crearSQL)) {
			preparedStatement.setInt(1, facturaDTO.getInConsecutivoFactura());
			preparedStatement.setString(2, facturaDTO.getDaFechaFactura());
			preparedStatement.setInt(3, facturaDTO.getPedidoVentaDTO().getInCodigoPedidoVenta());
			preparedStatement.setString(4, facturaDTO.getNvEstadoFactura());
			preparedStatement.executeUpdate();
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema creando la Factura: " + exception.getMessage());
		}
	}

	public void actualizar(FacturaDTO facturaDTO, Connection connection) throws SQLException {
		actualizarSQL = "UPDATE Factura SET Da_Fecha_Factura = ISNULL(?, Da_Fecha_Factura), In_Codigo_PedidoVenta = ISNULL(?, In_Codigo_PedidoVenta), Nv_Estado_Factura = ISNULL(?, Nv_Estado_Factura) WHERE In_Codigo_Factura = ?";
		try (PreparedStatement preparedStatement = connection.prepareStatement(actualizarSQL)) {
			preparedStatement.setString(1, facturaDTO.getDaFechaFactura());
			preparedStatement.setInt(2, facturaDTO.getPedidoVentaDTO().getInCodigoPedidoVenta());
			preparedStatement.setString(3, facturaDTO.getNvEstadoFactura());
			preparedStatement.setInt(4, facturaDTO.getInCodigoFactura());
			preparedStatement.executeUpdate();
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema actualizando la Factura: " + exception.getMessage());
		}
	}

	public FacturaDTO consultarPorCodigo(FacturaDTO facturaDTO, Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Factura WHERE In_Codigo_Factura = ?";
		FacturaDTO facturaDTOResultado = null;
		PedidoVentaDTO pedidoVentaDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			preparedStatement.setInt(1, facturaDTO.getInCodigoFactura());
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				facturaDTOResultado = new FacturaDTO();
				facturaDTOResultado.setInCodigoFactura(resultSet.getInt("In_Codigo_Factura"));
				facturaDTOResultado.setInConsecutivoFactura(resultSet.getInt("In_Consecutivo_Factura"));
				facturaDTOResultado.setDaFechaFactura(resultSet.getString("Da_Fecha_Factura"));
				pedidoVentaDTO = new PedidoVentaDTO();
				pedidoVentaDTO.setInCodigoPedidoVenta(resultSet.getInt("In_Codigo_PedidoVenta"));
				facturaDTOResultado.setPedidoVentaDTO(pedidoVentaDTO);
				facturaDTOResultado.setNvEstadoFactura(resultSet.getString("Nv_Estado_Factura"));
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando la Factura a traves del codigo: " + exception.getMessage());
		}
		return facturaDTOResultado;
	}

	public FacturaDTO consultarPorConsecutivo(FacturaDTO facturaDTO, Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Factura WHERE In_Consecutivo_Factura = ?";
		FacturaDTO facturaDTOResultado = null;
		PedidoVentaDTO pedidoVentaDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			preparedStatement.setInt(1, facturaDTO.getInConsecutivoFactura());
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				facturaDTOResultado = new FacturaDTO();
				facturaDTOResultado.setInCodigoFactura(resultSet.getInt("In_Codigo_Factura"));
				facturaDTOResultado.setInConsecutivoFactura(resultSet.getInt("In_Consecutivo_Factura"));
				facturaDTOResultado.setDaFechaFactura(resultSet.getString("Da_Fecha_Factura"));
				pedidoVentaDTO = new PedidoVentaDTO();
				pedidoVentaDTO.setInCodigoPedidoVenta(resultSet.getInt("In_Codigo_PedidoVenta"));
				facturaDTOResultado.setPedidoVentaDTO(pedidoVentaDTO);
				facturaDTOResultado.setNvEstadoFactura(resultSet.getString("Nv_Estado_Factura"));
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando la Factura a traves del consecutivo: " + exception.getMessage());
		}
		return facturaDTOResultado;
	}

	public ArrayList<FacturaDTO> consultarTodo(Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Factura";
		FacturaDTO facturaDTOResultado = null;
		PedidoVentaDTO pedidoVentaDTO = null;
		ArrayList<FacturaDTO> facturaDTOLista = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				facturaDTOResultado = new FacturaDTO();
				facturaDTOResultado.setInCodigoFactura(resultSet.getInt("In_Codigo_Factura"));
				facturaDTOResultado.setInConsecutivoFactura(resultSet.getInt("In_Consecutivo_Factura"));
				facturaDTOResultado.setDaFechaFactura(resultSet.getString("Da_Fecha_Factura"));
				pedidoVentaDTO = new PedidoVentaDTO();
				pedidoVentaDTO.setInCodigoPedidoVenta(resultSet.getInt("In_Codigo_PedidoVenta"));
				facturaDTOResultado.setPedidoVentaDTO(pedidoVentaDTO);
				facturaDTOResultado.setNvEstadoFactura(resultSet.getString("Nv_Estado_Factura"));
				facturaDTOLista = new ArrayList<FacturaDTO>();
				facturaDTOLista.add(facturaDTOResultado);
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando las Facturas: " + exception.getMessage());
		}
		return facturaDTOLista;
	}
}
